package com.stone.util;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.NumberUtil;

import java.util.Scanner;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * @description: 网络工具类
 * @author: zoubaolu
 * @date: 2022年06月23日 9:37
 */
public class NetworkUtil {
    /**
     * 获取端口号
     *
     * @return int
     * @author: zoubaolu
     * @date: 2022/6/23 9:58
     */
    public static int getPort() {
        int port;
        int defaultPort = 8001;
        Future<Integer> future = ThreadUtil.execAsync(() -> {
            int inputPort;
            System.out.println("请于5秒钟内输入端口号, （比如：8001、8002、8003），超过5秒将默认使用 " + defaultPort + "，端口号：");
            Scanner scanner = new Scanner(System.in);
            while (true) {
                String strPort = scanner.nextLine();
                if (!NumberUtil.isInteger(strPort)) {
                    System.err.println("端口只能输入数字");
                    continue;
                }
                inputPort = Convert.toInt(strPort);
                if (inputPort < 1024 || inputPort > 40191) {
                    System.err.println("端口只能输入1024~40191之间的数字");
                    continue;
                }
                scanner.close();
                break;
            }
            return inputPort;
        });
        try {
            port = future.get(10, TimeUnit.SECONDS);
        } catch (Exception e) {
            port = defaultPort;
        }
        if (!NetUtil.isUsableLocalPort(port)) {
            System.err.printf("端口%d被占用了，无法启动%n", port);
            System.exit(1);
        }
        return port;
    }
}
